<?php

class webSocket
{
    //监听ip
    protected $host;
    //监听端口
    protected $port;
    //服务对象
    protected $httpServer;

    public function __construct($port = 9051, $host = '0.0.0.0')
    {
        $this->host = $host;
        $this->port = $port;
        $this->httpServer = new Swoole\WebSocket\Server($this->host, $this->port);
        $this->httpServer->set(
            [
                'worker_num'=>2,
                'task_worker_num'=>2 //设置任务进程必须设置进程数量同时必须实现onTask、onFinish方法
            ]
        );
        // 监听客户端链接并打开(有客服端有链接就会触发)
        $this->httpServer->on('open', [$this, 'onOpen']);
        // 监听消息事件
        $this->httpServer->on('message', [$this, 'onMessage']);
        // 监听任务事件
        $this->httpServer->on('task', [$this, 'onTask']);
        $this->httpServer->on('finish', [$this, 'onFinish']);
        // 监听关闭事件
        $this->httpServer->on('close', [$this, 'onClose']);
        //启动服务
        $this->httpServer->start();
    }

    /**
     * @param swoole_websocket_server $server
     * @param swoole_http_request $request
     *   创建  客户端链接事件
     */
    public static function onOpen(swoole_websocket_server $server, swoole_http_request $request)
    {
       echo '链接成功';
        if ($request->fd == 1) {
            $a =swoole_timer_tick(3000,function ()use ($server,$request){
                global $a;
                 echo $a;
            });
            var_dump($a);
        }
    }


    //监听客服端发送的消息  $frame 接受客户端发送的消息    // 监听消息事件
    public static function onMessage(Swoole\WebSocket\Server $server, swoole_websocket_frame $frame)
    {
//        耗时10秒
        $data = [
            'task_worker_num'=>5,
            'task'=>1,
            'fd'=>$frame->fd
        ];
        $id =swoole_timer_after(5000,function () use($server,$frame){
            global $id;
            var_dump($id);
            $server->push($frame->fd, '你好世界：'.date('Y-m-d H:i:s'));
        });
//        交给task任务去处理
        $server->task($data);
        var_dump($id);
        $server->push($frame->fd, '你好世界：'.date('Y-m-d H:i:s'));
    }

    /**
    /**  实现本方法必须实现onFinish事件
     * @param \Swoole\WebSocket\Server $server 服务对象 是http就是http对象 webscoket就是webscoket对象
     * @param $task_id int 任务id 由swoole扩展内自动生成
     * @param $src_worker_id  int 来自于哪个worker进程id
     * @param $data array 是任务的数据
     * @return string
     */
    public function onTask(Swoole\WebSocket\Server $server, $task_id, $src_worker_id, $data)
    {
        print_r($data);
        sleep(10);
        return '123';
    }

    /**
     * @param \Swoole\WebSocket\Server $server  服务对象 是http就是http对象 webscoket就是webscoket对象
     * @param $task_id  int 任务id 由swoole扩展内自动生成
     * @param string $data 是onTask 方法返回的数据
     */
    public function onFinish(Swoole\WebSocket\Server $server,  $task_id, string $data){
        print_r($data);
    }

    //客服端关闭链接
    public static function onClose(Swoole\WebSocket\Server $server, $fd)
    {
    }

}

$webSocket = new webSocket(9988);
